<?php

class AdmFrmContactoEmpresa extends TPage {
//<editor-fold defaultstate="collapsed" desc="Verifica Usuario Logueado">
  /**
   * determina si el usuario esta logueado en el sistema
   * @author VSR, 01/01/2011
   */
  private function usuarioLogueado(){
    $estaLogueado = false;
    try {
      $session = new THttpSession;
      $session->open();
      $oUsuario = $session[Usuario::NOMBRE_ENTIDAD];
      if(isset($oUsuario)){
        $estaLogueado = true;
      }
    } catch (Exception $e) {
      $estaLogueado = false;
    }
    return $estaLogueado;
  }

  /**
   * redirecciona al login
   * @author VSR, 01/01/2011
   */
  private function redireccionarLogin(){
    $this->Response->redirect($this->Service->constructUrl("Admin"));
  }
//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Constantes">
  const SESION_DATOS = "arr";
  //funciones pagina
  const FUNCION_VER = "Ver";
  const FUNCION_CREAR = "Crear";
  const FUNCION_EDITAR = "Editar";
  const FUNCION_ELIMINAR = "Eliminar";

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">
  /**
   * obtiene los registros desde la base de datos
   * @param <type> $indiceContacto
   * @author VSR, 04/05/2012
   */
  private function obtenerDatos($indiceContacto){
    $arrDetalle = null;
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $arr = Utilidades::obtenerSessionPorNombre(WfEmpresaContacto::SESION_LISTADO);
      if($indiceContacto != "-1") {
        if(!Utilidades::isNullOrEmpty($arr)){
          $arrDetalle = $arr[$indiceContacto];
        }
      }
      Utilidades::grabarSessionPorNombre(self::SESION_DATOS.$nombrePagina, $arrDetalle);
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * actualiza los controles de la pagina segun los datos obtenidos
   * @author VSR, 01/01/2011
   */
  private function actualizaInterfaz(){
    $totalRegistros = 0;
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $indiceContacto = $this->txtIndiceContacto->Value;
      $arrDetalle = Utilidades::obtenerSessionPorNombre(self::SESION_DATOS.$nombrePagina);

      //inicializa controles en vacio
      $nombre = "";
      $paterno = "";
      $materno = "";
      $rut = "";
      $email = "";
      $telefono = "";
      $celular = "";
      $cargo = "";
      $direccion = "";
      $observacion = "";

      if(Utilidades::isNullOrEmpty($arrDetalle)){
        $totalRegistros = 0;
      } else {
        $totalRegistros = count($arrDetalle);
      }

      if($totalRegistros > 0) {
        $row = $arrDetalle;
        $nombre = $row["Nombre"];
        $paterno = $row["Paterno"];
        $materno = $row["Materno"];
        $rut = $row["Rut"];
        $email = $row["Email"];
        $telefono = $row["Telefono"];
        $celular = $row["Celular"];
        $cargo = $row["Cargo"];
        $direccion = $row["Direccion"];
        $observacion = $row["Observacion"];
      }
    } catch (Exception $e) {
      $nombre = "";
      $paterno = "";
      $materno = "";
      $rut = "";
      $email = "";
      $telefono = "";
      $celular = "";
      $cargo = "";
      $direccion = "";
      $observacion = "";
    }
    $this->lblTituloFormulario->Text = (($indiceContacto == "-1") ? "Crear" : "Modificar")." Contacto";
    $this->txtNombre->Text = $nombre;
    $this->txtPaterno->Text = $paterno;
    $this->txtMaterno->Text = $materno;
    $this->txtRut->Text = $rut;
    $this->txtEmail->Text = $email;
    $this->txtTelefono->Text = $telefono;
    $this->txtCelular->Text = $celular;
    $this->txtCargo->Text = $cargo;
    $this->txtDireccion->Text = $direccion;
    $this->txtObservacion->Text = $observacion;
}

  /**
   * inicializa algunos controles cuando se carga por primera vez la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControles($isPostBack){
    try {
      $nombrePagina = $this->obtenerNombrePagina();
      $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado".$nombrePagina), "");
      $cargarDesdePopUp = "0";
      $idEmpresa = $this->txtIdEmpresa->Value;
      $indiceContacto = $this->txtIndiceContacto->Value;

      if($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "ELIMINADO") {
        $cargarDesdePopUp = "1";
      }

      //agrega atributo a control
      $this->btnCrear->Attributes->Add("onclick", "return(validarFormularioContactoEmpresa())");
      $this->btnAplicar->Attributes->Add("onclick", "return(validarFormularioContactoEmpresa())");
      $this->btnAceptar->Attributes->Add("onclick", "return(validarFormularioContactoEmpresa())");
      $this->btnEliminar->Attributes->Add("onclick", "return(eliminarFilaContactoEmpresa(".$indiceContacto.", 'PopUp'))");
      $this->btnCerrar->Attributes->Add("onclick", "cerrarPopUpContactoEmpresa('".$idEmpresa."')");

      //inicializa los controles del Correlativo y Locales
      $this->inicializaControlesEventoWindowOnLoad($isPostBack);

      //verifica los permisos sobre los controles
      $this->verificarPermisos();

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * inicializa los controles al cargar la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControlesEventoWindowOnLoad($isPostBack) {
    $nombrePagina = $this->obtenerNombrePagina();
    $estado = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("Estado".$nombrePagina), "");
    $sb = new StringBuilder();

    if($estado == "INGRESADO" || $estado == "MODIFICADO" || $estado == "") {
      $sb->appendLine("setTimeout(\"ocultarElemento('".$this->pnlMensajeUsuario->ClientID."')\", 5000);");
    }
    $this->Page->ClientScript->registerEndScript("windowOnLoad", $sb->toString());
  }

  /**
   * verifica los permisos sobre los controles
   * @author VSR, 01/01/2011
   */
  private function verificarPermisos(){
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $indiceContacto = $this->txtIndiceContacto->Value;
    //verifica los permisos para los controles
    $this->pnlContenido->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER);
    $this->hBotonCrear->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $indiceContacto == "-1" && Utilidades::tienePermiso($paginaActual, self::FUNCION_CREAR);
    $this->hBotonAplicar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $indiceContacto != "-1" && Utilidades::tienePermiso($paginaActual, self::FUNCION_EDITAR);
    $this->hBotonAceptar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $indiceContacto != "-1" && Utilidades::tienePermiso($paginaActual, self::FUNCION_EDITAR);
    $this->hBotonEliminar->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER) && $indiceContacto != "-1" && Utilidades::tienePermiso($paginaActual, self::FUNCION_ELIMINAR);

    if(!$this->pnlContenido->Visible) {
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "No tiene permiso para ver esta p&aacute;gina", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
  }

  /**
   * muestra mensaje al usuario
   * @author VSR, 01/01/2011
   */
  private function mostrarMensajeUsuario(){
    try {
      $mensaje = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("msg"),"");
      $baseUrl = $this->Page->Theme->BaseUrl;

      //asigna mensaje al panel
      $this->pnlMensajeUsuario->Visible = true;

      //dependiendo de la marca especial que tenga el sistema es como se muestra el mensaje al usuario
      if(strpos($mensaje, "{#INGRESADO}") === 0) {
        $mensaje = str_replace("{#INGRESADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#MODIFICADO}") === 0) {
        $mensaje = str_replace("{#MODIFICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#ELIMINADO}") === 0) {
        $mensaje = str_replace("{#ELIMINADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#DUPLICADO}") === 0) {
        $mensaje = str_replace("{#DUPLICADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } elseif (strpos($mensaje, "{#ERROR}") === 0) {
        $mensaje = str_replace("{#ERROR}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } else {
        $this->pnlMensajeUsuario->Visible = false;
      }
      Utilidades::grabarSessionPorNombre("msg", "");
    } catch (Exception $e) {
      $this->pnlMensajeUsuario->Visible = false;
    }

  }

  /**
   * obtiene nombre de la pagina actual
   * @return <type>
   * @author VSR, 01/01/2011
   */
  private function obtenerNombrePagina(){
    $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
    return $nombrePagina;
  }

  /**
   * graba los datos del contacto
   * @author VSR, 04/05/2012
   */
  private function grabar($accion) {
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $indiceContacto = $this->txtIndiceContacto->Value;
      $idEmpresa = $this->txtIdEmpresa->Value;
      $status = "";
      $textoMensaje = "";
      $grabadoConExito = true;
      $queryStringPagina = "";

      //grabar valores
      $textoMensaje .= $this->grabarDatos($status, $indiceContacto);

      if ($textoMensaje != "") {
        $grabadoConExito = false;
      } else {
        $grabadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($grabadoConExito) {
        switch ($status) {
          case "ingresado":
            $textoMensaje = "{#INGRESADO}El contacto fue ingresado satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "INGRESADO");
            break;
          case "modificado":
            $textoMensaje = "{#MODIFICADO}El contacto fue actualizado satisfactoriamente.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "MODIFICADO");
            break;
          case "duplicado":
            $textoMensaje = "{#DUPLICADO}El contacto ya existe. Ingrese otro por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "DUPLICADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo grabar el contacto. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
            break;
          default:
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      if (($status == "ingresado" || $status == "modificado") && $accion == Sistema::ACEPTAR ) {
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
        $this->Page->ClientScript->registerEndScript("cerrarPopUp", "cerrarPopUpContactoEmpresa('".$idEmpresa."');");
      } else {
        Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
        //construye query string con los valores correspondientes
        $queryStringPagina = "&idEmpresa=".$idEmpresa."&indiceContacto=".$indiceContacto;
        $this->Response->redirect("index.php?page=".$nombrePagina.$queryStringPagina);
      }
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * graba o actualiza la pagina en base de datos
   * @param <type> $status
   * @param <type> $indiceContacto
   * @return string
   * @author VSR, 04/05/2012
   */
  private function grabarDatos(&$status, &$indiceContacto) {
    $msgError = "";
    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      $arr = Utilidades::obtenerSessionPorNombre(WfEmpresaContacto::SESION_LISTADO);

      $nombre = $this->txtNombre->Text;
      $paterno = $this->txtPaterno->Text;
      $materno = $this->txtMaterno->Text;
      $rut = $this->txtRut->Text;
      $email = $this->txtEmail->Text;
      $telefono = $this->txtTelefono->Text;
      $celular = $this->txtCelular->Text;
      $cargo = $this->txtCargo->Text;
      $direccion = $this->txtDireccion->Text;
      $observacion = $this->txtObservacion->Text;
      $idEmpresa = $this->txtIdEmpresa->Value;

      if($indiceContacto == "-1"){
        $arr[] = array(
          "IdContacto"=>"-1",
          "Nombre"=>$nombre,
          "Paterno"=>$paterno,
          "Materno"=>$materno,
          "Rut"=>$rut,
          "Direccion"=>$direccion,
          "Email"=>$email,
          "Telefono"=>$telefono,
          "Celular"=>$celular,
          "Cargo"=>$cargo,
          "Observacion"=>$observacion,
          "IdEmpresa"=>$idEmpresa,
          "AccionSQL"=>"INSERT"
        );
        //reasigan los indices del array
        $arr = Utilidades::reasignarIndiceArray($arr);
      } else {
        $arr[$indiceContacto]["Nombre"] = $nombre;
        $arr[$indiceContacto]["Paterno"] = $nombre;
        $arr[$indiceContacto]["Materno"] = $materno;
        $arr[$indiceContacto]["Rut"] = $rut;
        $arr[$indiceContacto]["Direccion"] = $direccion;
        $arr[$indiceContacto]["Email"] = $email;
        $arr[$indiceContacto]["Telefono"] = $telefono;
        $arr[$indiceContacto]["Celular"] = $celular;
        $arr[$indiceContacto]["Cargo"] = $cargo;
        $arr[$indiceContacto]["Observacion"] = $observacion;
        $arr[$indiceContacto]["IdEmpresa"] = $idEmpresa;
        $arr[$indiceContacto]["AccionSQL"] = "UPDATE";
      }

      //grabar el nuevo array en sesion
      Utilidades::grabarSessionPorNombre(WfEmpresaContacto::SESION_LISTADO, $arr);

      $status = ($indiceContacto == "-1") ? "ingresado" : "modificado";
      $indiceContacto = ($indiceContacto == "-1") ? (count($arr) - 1) : $indiceContacto;
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo grabar el contacto.<br/>";
      $indiceContacto = ($indiceContacto != "-1") ? $indiceContacto : "-1";
      $status = "error";
    }
    return $msgError;
  }

  /**
   * elimina los datos de un contacto
   * @param <type> $status
   * @param <type> $indiceContacto
   * @return string
   * @author VSR, 04/05/2012
   */
  private function eliminar(&$status, $indiceContacto) {
    $msgError = "";

    try {
      $retorno = Utilidades::eliminarFilaSesion($indiceContacto, WfEmpresaContacto::SESION_LISTADO);
      if($retorno == Sistema::CODIGO_SQL_ERROR){
        throw new Exception("No se puedo eliminar el contacto");
      }
      $status = "eliminado";
    } catch (Exception $e) {
      $msgError = "Se produjo un error interno, no se pudo eliminar el contacto.<br/>".$e->getMessage();
      $status = "error";
    }
    //retorna valor
    return $msgError;
  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);
    //si no esta conectado entonces lo redirecciona al login
    if(!$this->usuarioLogueado()){
      $this->redireccionarLogin();
    }

    $idEmpresa = $this->Request["idEmpresa"];
    $indiceContacto = $this->Request["indiceContacto"];
    $nombrePagina = $this->obtenerNombrePagina();
    $this->txtIdEmpresa->Value = $idEmpresa;
    $this->txtIndiceContacto->Value = $indiceContacto;
    $this->txtThemeBaseUrl->Value = $this->Page->Theme->BaseUrl;

    if(!$this->IsPostBack) {
      $this->obtenerDatos($indiceContacto);
      $this->inicializaControles($this->IsPostBack);
      $this->actualizaInterfaz();
      $this->mostrarMensajeUsuario();
      Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
    }

  }

  public function btnCrearClick($sender, $param){
    $this->grabar(Sistema::APLICAR);
  }

  public function btnAplicarClick($sender, $param){
    $this->grabar(Sistema::APLICAR);
  }

  public function btnAceptarClick($sender, $param){
    $this->grabar(Sistema::ACEPTAR);
  }

  public function btnEliminarClick($sender, $param){
    $indiceContacto = $this->txtIndiceContacto->Value;
    $idEmpresa = $this->txtIdEmpresa->Value;
    $status = "";
    $textoMensaje = "";
    $eliminadoConExito = true;
    $queryStringPagina = "";

    try {
      $nombrePagina = Utilidades::obtenerNombrePaginaActual($this);
      //elimina el registro
      $textoMensaje .= $this->eliminar($status, $indiceContacto);

      if ($textoMensaje != "") {
        $eliminadoConExito = false;
      } else {
        $eliminadoConExito = true;
      }

      //muestra mensaje dependiendo si se grabo o no
      if ($eliminadoConExito) {
        switch ($status) {
          case "eliminado":
            $textoMensaje = "{#ELIMINADO}El contacto fue eliminado satisfactoriamente. Complete el formulario para ingresar uno nuevo.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ELIMINADO");
            break;
          case "error":
            $textoMensaje = "{#ERROR}Se produjo un error interno y no se pudo eliminar el contacto. Intente nuevamente por favor.<br />";
            Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
            break;
        }
      } else {
        $textoMensaje = "{#ERROR}".$textoMensaje;
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "ERROR");
      }

      /*
       * DESCOMENTAR ESTE IF SI SE QUIERE QUE LA PAGINA SE CIERRE AUTOMATICAMENTE
      if ($status == "ingresado" || $status == "modificado") {
        Utilidades::grabarSessionPorNombre("Estado".$nombrePagina, "");
        $this->Page->ClientScript->registerEndScript("cerrarPopUp", "cerrarPopUpPregunta('".$idPregunta."','1','".urlEncode($this->txtPregunta->Text)."');");
      } else {
      */
        Utilidades::grabarSessionPorNombre("msg", $textoMensaje);
        //construye query string con los valores correspondientes
        $queryStringPagina = "&idEmpresa=".$idEmpresa."&indiceContacto=".(($status == "eliminado") ? "-1" : $indiceContacto);
        $this->Response->redirect("index.php?page=".$nombrePagina.$queryStringPagina);
      /*}*/
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

//</editor-fold>


}
?>
